package com.cskaoyan.javase.oop1._6constructor.thiss;

/**
 * this关键字在构造器中的作用
 *      1.(常见,一般的) 和成员方法中的this相同的作用
 *      2.(特殊,独属于构造器的用途) 在构造器中使用this关键字表示调用同类中的其他构造器
 *          语法: this(实参列表);
 *          根据实参列表的不同,决定调用某个构造器
 *          语法细节:
 *              this关键字在表示调用构造器时,该行语句必须在第一行.
 *              所以this在表示调用构造器时,一个构造器中最多只有一个.
 *
 * new对象过程中的构造器的执行,总是从new对象的那个构造器开始(方法栈帧进栈)
 * 在这个过程中,可能会执行其他构造器
 *
 * 在一次new对象的过程中,构造器可能执行多个(但肯定不是无数个)
 * 但是显式赋值最多执行一次,而且是把所有构造器都开始执行后,再来执行显式赋值
 *
 * @since 09:43
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Person p = new Person("张三", 18, "女");
        System.out.println(p.age);
        System.out.println(p.gender);
        System.out.println(p.name);
    }
}

class Person {
    String name = "法外狂徒";
    int age;
    /*
        性别这种属性
        在开发中建议使用String类型来描述
            不建议使用boolean isMale/isFemale
      */
    String gender;

    public Person() {
        // this();
    }

    public Person(String name) {
        this();
        this.name = name;
    }

    public Person(String name, int age) {
        this(name);
        this.name = name;
        this.age = age;
    }

    public Person(String name, int age, String gender) {
        // this.name = name;
        // this.age = age;
        // 以上赋值语句用this调用构造器替换
        // Call to 'this()' must be first statement in constructor body
        this(name, age);
        this.gender = gender;
        // this._3test();
    }

    public void test() {
    }
}

class A {
    // 偶尔出现: A类对象的初始化,比较复杂,需要一个方法执行来完成
    public void init() {
        System.out.println("初始化A类对象....");
    }

    public A() {
        init();
    }
}